package net.lulihu.common_util.jdbc.mapper;

import net.lulihu.Assert;
import net.lulihu.common_util.jdbc.model.TemplateParam;
import net.lulihu.common_util.jdbc.template.InsertSqlTemplate;
import net.lulihu.common_util.jdbc.template.UpdateSqlTemplate;

import java.util.List;

/**
 * 无需指定类型映射对象
 */
public class NoTypeDaoMapper extends DatabaseMapper {

    private final InsertSqlTemplate insertSqlTemplate;
    private final UpdateSqlTemplate updateSqlTemplate;

    NoTypeDaoMapper() {
        this.insertSqlTemplate = InsertSqlTemplate.getInstance();
        this.updateSqlTemplate = UpdateSqlTemplate.getInstance();
    }

    /**
     * 根据主键id修改映射值
     *
     * @param bean 对象
     * @return 影响行数
     */
    public int updateById(Object bean) {
        Assert.notNull(bean, "插入对象不可以为空...");
        return 0;
    }

    /**
     * 插入一条数据
     *
     * @param bean 对象
     * @return true 成功反之失败
     */
    public int insert(Object bean) {
        Assert.notNull(bean, "插入对象不可以为空...");
        TemplateParam templateParam = insertSqlTemplate.insertSqlTemplate(bean);
        return change(templateParam.getSqlStatement(), templateParam.getParams());
    }

    /**
     * 批量插入sql
     *
     * @param beans 多个bean对象
     * @return 返回影响行数
     */
    public int batchInsert(List<?> beans) {
        Assert.notEmpty(beans, "插入对象不可以为空...");
        TemplateParam templateParam = insertSqlTemplate.batchInsertSqlTemplate(beans);
        return change(templateParam.getSqlStatement(), templateParam.getParams());
    }

    /**
     * 执行 增/删/改 语句
     *
     * @param sqlStatement sql命令 这边的占位符使用 ?
     * @param params       占位符替换参数，将按照顺序替换sql语句的 ?
     * @return 影响行数
     */
    public int change(String sqlStatement, Object... params) {
        return execute((connection) -> getSqlStatementExecutor().executeUpdate(connection, sqlStatement, params));
    }


}
